<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>

<body>
    <script>
        const data = [1, 2, [1, [2, 3, [4, 5, [6]]]]];
        function flatter(arr) {
            if (!arr.length) return;
            while (arr.some((item) => Array.isArray(item))) {
                arr = [].concat(...arr);
                console.log(`JSON.stringify(arr)-${JSON.stringify(arr)}`);
            }
            return arr;
        }
        const res = flatter(data);
     
        /**
         * 1、用 Array.isArray 判断是否是数组是稳妥的数组判断的方式，同样稳妥的还有 Object.prototype.toString().call()
         * see：https://www.cnblogs.com/echolun/p/10287616.html
         * 
         * 2、Array.prototype.some 方法用来检测 arr 是否至少有一个元素是数组，
         * 若是则将 arr 展开(...temp)的结果连接(concat)到空数组([]),展开拍平了一次数组，concat 也拍平了一次数组
         * ，最后将结果赋值给 arr，
         * 
         *  第一次：JSON.stringify(arr)-[1,2,1,[2,3,[4,5,[6]]]]
            第二次：JSON.stringify(arr)-[1,2,1,2,3,[4,5,[6]]]
            第三次：JSON.stringify(arr)-[1,2,1,2,3,4,5,[6]]
            第四次：JSON.stringify(arr)-[1,2,1,2,3,4,5,6]
         * 第一次
         * 展开(...arr)后的数据：
         * 1,2,[1, [2, 3, [4, 5, [6]]]]
         * concat 后的数据
         * 1,2,1,[2, 3, [4, 5, [6]]]
         * 最终得到的 arr
         * [1,2,1,[2, 3, [4, 5, [6]]]]
         * 
         * 第二次
         * 展开(...arr)后的数据：
         * 1,2,1,[2, 3, [4, 5, [6]]]
         * concat 后的数据
         * 1,2,1,2,3,[4,5,[6]]
         * 最终得到的 arr
         * [1,2,1,2,3,[4,5,[6]]]
         * 
         * 第三次
         * 展开(...arr)后的数据：
         * 1,2,1,2,3,[4,5,[6]]
         * concat 后的数据
         * 1,2,1,2,3,4,5,[6]
         * 最终得到的 arr
         * [1,2,1,2,3,4,5,[6]]
         * 
         * 第四次
         * 展开(...arr)后的数据：
         * 1,2,1,2,3,4,5,[6]
         * concat 后的数据
         * 1,2,1,2,3,4,5,6
         * 最终得到的 arr
         * [1,2,1,2,3,4,5,6]

        */


    </script>
</body>

</html>